
package TDAGrafo;

import TDALista.TElemento;
import TDALista.TLista;

/**
 * @author La revancha
 */



public class TVertice {

	@SuppressWarnings("rawtypes")
	public Comparable etiqueta;
	public TLista adyacentes;
	public boolean visitado;
	public int pos;

	@SuppressWarnings("rawtypes")
	public TVertice(Comparable etiqueta) {
		this.etiqueta = etiqueta;
		adyacentes = new TLista();
		visitado = false;
	}

	/**
	 * Metodo que obtiene el primer adyacente al vertice.
	 * @return el el vertice que est aprimero el la lista ede adyacencias.
	 */

	public TVertice primerAdyacente() {

		TElemento objElemento = adyacentes.obtenerPrimero();
		if (objElemento != null) {
			return ((TAdyacencia) objElemento.datos).destino;
		}

		return null;
	}

	/**
	 * Metodo que se encarga de encontrar el vertice que le sigue al vertice que le pasamos por parametro (si el vertice se encuentra en
	 * nuestra lista de adyacentes).
	 * @param vertice
	 * @return null en caso de que el vertice no se encuentre en la lsita de adyacencias o si el vertice es el ultimo en
	 * nuestra lista de adyacentes, sino retorna el vertice que le sigue al vertice que le pasamos por parametro.
	 */

	public TVertice siguienteAdyacente(TVertice vertice) {
		if (vertice!= null){
			TElemento aux = adyacentes.primero;
			while (aux!=null){
				TVertice sig = ((TAdyacencia) aux.datos).destino;
				if (vertice.etiqueta.equals(sig.etiqueta)){
					if (aux.siguiente != null){
						return ((TAdyacencia) aux.siguiente.datos).destino;

					}

					return null;

				}



			}


		}

		return null;
	}


	public void bpfinterno (TCamino camino){
		visitado=true;

		TElemento lista =adyacentes.primero;
		while (lista!= null) {
			TAdyacencia aux = (TAdyacencia) lista.datos;
			if (!(aux.destino.visitado)){
				TAdyacencia nueva= new TAdyacencia(aux.destino, null);
				camino.recorrido(nueva);
				aux.destino.bpfinterno(camino);
				}

			lista=lista.siguiente;

		}


	}

	/**
	 *
	 * Metodo que inserta una adyancencia en nuestra lista.
	 * @param nueva
	 * @return true si pudo insertarla, false de caso contraria (no se aceptan adyacencias repetidas).
	 */

	public boolean insertarAdyacencia (TAdyacencia nueva){
		if (nueva !=null){
			TElemento ainsertar = new TElemento (nueva.destino.etiqueta,nueva);
			if (!(adyacentes.existeElemento(ainsertar))){
				return adyacentes.insertarAlFinal(ainsertar);
				
				
			}
				
		}
		
		return false;
		
		
	}


	public Integer obtenerCostoAdyacencia(TVertice destino) {
		TElemento elem = adyacentes.buscarEtiqueta(destino.etiqueta);
		if (elem != null) {
			Integer aDevolver = Integer.parseInt((String)((TAdyacencia) elem.datos).costo);
			return aDevolver;
		} else {
			return null;
		}
	}
}
